package cn.zwz.data.controller;

import cn.hutool.core.util.StrUtil;
import cn.zwz.basics.baseVo.Result;
import cn.zwz.basics.log.LogType;
import cn.zwz.basics.log.SystemLog;
import cn.zwz.basics.utils.Base64DecodeMultipartFile;
import cn.zwz.basics.utils.CommonUtil;
import cn.zwz.basics.utils.ResultUtil;
import cn.zwz.data.entity.File;
import cn.zwz.data.entity.Setting;
import cn.zwz.data.service.IFileService;
import cn.zwz.data.service.ISettingService;
import cn.zwz.data.utils.ServerConfig;
import cn.zwz.data.utils.ZwzFileUtils;
import cn.zwz.data.vo.OssSettingVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;


@RestController
@Api(tags = "文件上传接口")
@RequestMapping("/zwz/upload")
@Transactional
/**
 * 文件上传控制器类，用于处理文件上传相关的请求。
 */
public class UploadController {
    @Autowired
    private ServerConfig serverConfig;
    @Autowired
    private ZwzFileUtils zwzFileUtils;

    @Autowired
    private ISettingService iSettingService;

    @Autowired
    private IFileService iFileService;

    /**
     * 处理文件上传请求。
     *
     * @param file   上传的文件，可以为空。
     * @param base64 文件的Base64编码字符串，可以为空。
     * @return 返回上传结果，包含文件访问URL。
     */
    @SystemLog(about = "文件上传", type = LogType.DATA_CENTER, doType = "FILE-06")
    @RequestMapping(value = "/file", method = RequestMethod.POST)
    @ApiOperation(value = "文件上传")
    public Result<Object> upload(@RequestParam(required = false) MultipartFile file, @RequestParam(required = false) String base64) {
        // 如果提供了Base64编码字符串，则将其转换为MultipartFile对象
        if (StrUtil.isNotBlank(base64)) {
            file = Base64DecodeMultipartFile.base64Convert(base64);
        }
        String result = null;
        // 重命名文件以避免文件名冲突
        String fKey = CommonUtil.renamePic(file.getOriginalFilename());
        File f = new File();
        try {
            // 获取文件输入流并上传文件
            InputStream inputStream = file.getInputStream();
            result = zwzFileUtils.inputStreamUpload(inputStream, fKey, file);
            // 设置文件对象的相关属性
            f.setLocation(0);
            f.setName(file.getOriginalFilename());
            f.setSize(file.getSize());
            f.setType(file.getContentType());
            f.setFKey(fKey);
            f.setUrl(result);
            // 保存或更新文件信息到数据库
            iFileService.saveOrUpdate(f);
        } catch (Exception e) {
            // 如果上传过程中发生异常，返回错误信息
            return ResultUtil.error(e.toString());
        }
        // 获取OSS配置信息并返回文件访问URL
        OssSettingVo vo = getOssSetting();
        return ResultUtil.data(vo.getFileHttp() + vo.getFileView() + "/" + f.getId());
    }

    /**
     * 获取OSS配置信息。
     *
     * @return 返回包含OSS配置信息的OssSettingVo对象，如果配置信息不完整则返回null。
     */
    public OssSettingVo getOssSetting() {
        // 从数据库中获取 OSS相关配置
        Setting s1 = iSettingService.getById("FILE_VIEW"); // 文件访问路径
        Setting s2 = iSettingService.getById("FILE_HTTP"); // 文件访问地址
        Setting s3 = iSettingService.getById("FILE_PATH"); // 文件存储路径
        // 如果配置信息不完整，返回null
        if (s1 == null || s1 == null || s1 == null) {
            return null;
        }
        // 返回OSS配置信息对象
        return new OssSettingVo(s1.getValue(), s2.getValue(), s3.getValue());
    }
}

